package fumeurImpolie;

import java.util.ArrayList;
import java.util.List;


public class Cabaretier implements Runnable{
		
	private List<Fumeur> fumeurAttables = null;
 	
	public Cabaretier() {
		System.out.println("Initialisation du cabaretier ");
		fumeurAttables = new ArrayList<Fumeur>();
	}
	
	@Override
	public void run() {
		System.out.println("Entrer du cabaretier dans le problème.");
		while(true){
			try {

				//premiere condition
				TableSingleton.GetInstance().tableVide.acquire();
				//check deadLock
				System.out.print("Le cabaretier regarde pour un deadlock : ");
				if(deadLockDetected()){
					System.out.println("Deadlock identifier, on clean la table");
					TableSingleton.GetInstance().viderTable();
				}
				else{
					System.out.println(" Deadlock absent");
				}
				//deuxieme condition
				TableSingleton.GetInstance().tableVide.acquire();
				
				int ing1, ing2;
				ing1 = (int)(java.lang.Math.random()*3);
				ing2 = (int)(java.lang.Math.random()*3);
				if(ing1 == ing2){
					ing2 = (ing2+1)%3;
				}
				TableSingleton.GetInstance().AjouterIngredient(ing1,ing2);
				
				
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
	}

	private boolean deadLockDetected() throws InterruptedException {
		boolean threadDeadLocked = true;

		//si une ressource est disponible sur la table mais aucune activite
		int indexRessource  = TableSingleton.GetInstance().wichResourceIsAvailable();
		
		if(indexRessource != -1 && TableSingleton.GetInstance().thereIsOnlyOneIngredient()){ //TODO
			for(int i = 0 ; (i < fumeurAttables.size()) && !threadDeadLocked; ++i){
				if(fumeurAttables.get(i).besoinDeRessource(indexRessource)){
					threadDeadLocked = false;
				}
			}
		}
		else{
			threadDeadLocked = false;
		}
		
		return threadDeadLocked;
	}
	
	public void ajouterFumeur(Fumeur unFumeur) {
		fumeurAttables.add(unFumeur);
	}
}
